package juego;

import juego.Dificultad.*;
import juego.Tablero.InfoTablero;
import juego.Tablero.Tablero;
import juego.Vehiculo.*;

public class Juego {

	private Jugador jugador;
	private Dificultad dificultad;
	private Tablero tablero;
	
	
	// CONSTRUCTOR
	public Juego(String nuevoNombre, Vehiculo nuevoVehiculo, Dificultad nuevaDificultad){
		jugador = new Jugador(nuevoNombre,nuevoVehiculo);
		dificultad = nuevaDificultad;
		tablero = new Tablero(dificultad);
	}
	
	public InfoTablero getInfoTablero() { return tablero; }
	public Jugador getJugador() { return jugador; }
	
	public boolean mover(Movimiento movimiento) {
		return tablero.mover( jugador , movimiento);
	}

	public void setJuegoListener(JuegoListener listener) {
		tablero.setJuegoListener(listener);
	}

	public Dificultad getDificultad() {
		return dificultad;
	}

	public int contarMovimientos() {
		return jugador.getCantidadDeMovimientos();
	}
	
	public int contarPuntos() {
		int movimientosSobrantes = dificultad.getMaximoMovimientos() - jugador.getCantidadDeMovimientos();
		return (movimientosSobrantes * dificultad.getPuntosPorMovimientoSobrante());
	}

	public int contarSobrante() {
		return dificultad.getMaximoMovimientos() - jugador.getCantidadDeMovimientos();
	}

	public boolean gano() {
		return tablero.confirmarSiGano( jugador );
	}
	
	public boolean perdio() {
		return jugador.getCantidadDeMovimientos() >= dificultad.getMaximoMovimientos();
	}

	public void cargarJuego (int movimientos, Tablero tableroGuardado){
		jugador.setCantidadMovimientos(movimientos);
		tablero = tableroGuardado;
	}
	/*
	// JUEGO
	public void empezarJuego() {
		boolean hayGanador = false;
		jugadorActual = 0 ;
		while ( ! hayGanador) { // LOOP PRINCIPAL DEL JUEGO
			Movimiento queHacer = esperarUsuario();
			if ( queHacer == Movimiento.salir ) {
				break;
			}
			
			tablero.mover( jugadores.get(jugadorActual) , queHacer );
			if ( tablero.confirmarSiGano( jugadores.get(jugadorActual) ) ) {
				hayGanador = true;
				break;
			}
			
			jugadorActual = jugadorActual + 1;
		}
		
		contarPuntos(hayGanador);
	}
	
	public Movimiento esperarUsuario() {
		Random random = new Random();
		switch ( random.nextInt(4) ) { // hardcodeado para pruebas, se define desde interfaz
		
		case 0:	return Movimiento.abajo;
		case 1: return Movimiento.arriba;
		case 2: return Movimiento.derecha;
		case 3: return Movimiento.izquierda;
		case 4: return Movimiento.salir;
		}
		return Movimiento.izquierda;
	}
	
		

		public void guardarPartida (boolean partidaTerminada){
			
			PersistenciaDeJuego persistencia = new PersistenciaDeJuego();
			persistencia.guardar(jugador, dificultad, tablero, contarPuntos(partidaTerminada));
		}
		
		private void setJugadorGuardado (String vehiculoGuardado, int movimientosGuardados) {
			
			switch (vehiculoGuardado) {
			
			case "moto": this.jugador.setVehiculo(new Moto()); 
			
			case "auto": this.jugador.setVehiculo(new Auto()); 
			
			case "camioneta": this.jugador.setVehiculo(new Camioneta()); 
			}
			this.jugador.sumarCantidadDeMovimientos(movimientosGuardados);
			
		}
				
		private void setDificultadGuardada (String dificultad) {
			
			switch (dificultad) {
			
			case "Facil": this.dificultad = new Facil ();
			case "Moderado": this.dificultad = new Moderado ();
			case "Dificil": this.dificultad = new Dificil ();
			}
		}
		
		private void setTableroGuardado (PuntoInterseccion meta, PuntoInterseccion posicion) {
			
			this.tablero.setMeta(meta);
			this.tablero.setPosicionVehiculo(posicion);
		}
		
		public void recuperarPartida (String nombreJugador){
			
			PersistenciaDeJuego persistencia = new PersistenciaDeJuego();
			persistencia.buscarJugador(nombreJugador);
			this.setJugadorGuardado(persistencia.getVehiculoGuardado(), persistencia.getMovimientosGuardados());
			this.setDificultadGuardada (persistencia.getDificultadGuardada());
			this.tablero = new Tablero(this.dificultad);
			this.setTableroGuardado (persistencia.getMetaGuardada(),persistencia.getPosicionGuardada());
		}
		
			*/

	}

